package com;

import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.*;
import java.net.URL;
import java.util.Scanner;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;

/**
 * Diseño de un panel para ser usado en la clase Dialog
 * este permite mostrar informacion relacionada al puntaje
 * 
 * @author Mauricio Orellana and Alex Munoz
 * @version 2012-07-13
 */
public class Score extends JPanel implements KeyListener
{
    private Scanner in;
    private JTable table;
    private String name;
    private JTextField text;
    private Dialog dg;
    
    /**
     * Constructor de Objetos de la clase Score
     */
    public Score()
    {
        super();
        this.setLayout(new GridBagLayout());
        this.verPuntaje();
        
    }
    /**
     * Permite mostrar el puntaje leido desde un archivo mediante una tabla
     */
    public void verPuntaje()
    {
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.CENTER;
        JLabel img = new JLabel();
        String path = "Icons/gnotravex-logo.png";  
        URL url = this.getClass().getResource(path);  
        ImageIcon icon = new ImageIcon(url);
        img.setIcon(icon);
        this.add(img, this.valuesGrid(0, 0));
            
        JLabel title = new JLabel(CommandNames.SCORE_TITLE, JLabel.CENTER);
        title.setFont(new Font("Helvetica", Font.BOLD, 20));
        this.add(title, this.valuesGrid(0, 1));
            
        try
        {   
            this.in = new Scanner(new File(CommandNames.FILENAME));
            DefaultTableModel modelo = new DefaultTableModel(){
                @Override
                public boolean isCellEditable(int row, int column)
                {
                    return false;
                }
            };
            modelo.addColumn(CommandNames.PLAYER_NAME);
            modelo.addColumn(CommandNames.PLAYER_TIME);
            table = new JTable(modelo);
            while(in.hasNext())
            {
                String values[] = in.nextLine().split(" ");
                modelo.addRow(values);
            }
            
            JScrollPane scrollPane = new JScrollPane(table);
            this.add(scrollPane,this.valuesGrid(0, 2));
            
            
            in.close();
        }
        catch (FileNotFoundException ex)
        {
            JLabel mensaje = new JLabel(CommandNames.NO_SCORE, JLabel.CENTER);
            title.setFont(new Font("Helvetica", Font.BOLD, 20));
            this.add(mensaje, this.valuesGrid(0, 2));
        }
    }
    
    /**
     * Registrar puntaje permite registrar en un archivo una serie de integer que representa un tiempo que 
     * un player demoro en solucionar el juego
     * 
     * @param h entero que contiene las horas que demoro
     * @param m entero que contiene los minutos que demoro
     * @param s entero que contiene los segundos que demoro
     */
    public void registrarPuntaje(int h, int m, int s)
    {
        File f = new File("Score.txt");
        if(f.exists())
        {
            try 
            {
                this.solicitarNombre(h,m,s);
                if(this.name == null)
                {
                    return;
                }
                PrintStream ps = new PrintStream(new FileOutputStream(f,true));
                ps.println(name+" "+h+"H:"+Math.abs(m)+"M:"+Math.abs(s)+"S");
                ps.close();
                
            } catch (FileNotFoundException ex)
            {
                
            }
        }
        else
        {
            try
            {
                f.createNewFile();
                this.registrarPuntaje(h, m, s);
            } 
            catch (IOException ex)
            {
               System.out.println("Error");
            }
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {
        
    }

    @Override
    public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();
        if (key == KeyEvent.VK_ENTER) {
            this.name = text.getText();
            dg.dispose();
            
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        
    }
    /**
     * Muestra por pantalla el tiempo trancurrido y solicita el nombre del player
     * 
     * @param h entero que contiene las horas que demoro
     * @param m entero que contiene los minutos que demoro
     * @param s entero que contiene los segundo que demoro
     */
    private void solicitarNombre(int h, int m, int s)
    {
        JPanel panel = new JPanel(new GridBagLayout());
        panel.setSize(100, 100);
        
        JTextPane jta = new JTextPane();
        SimpleAttributeSet attribs = new SimpleAttributeSet();  
        StyleConstants.setAlignment(attribs , StyleConstants.ALIGN_CENTER);  
        jta.setParagraphAttributes(attribs,true); 
        jta.setText("Ha demorado: "+h+"h:"+Math.abs(m)+"m:"+Math.abs(s)+"s"+"\nIngrese su Nombre y luego presione ENTER para registrar");
        jta.setEditable(false);
        jta.setBackground(null);
        panel.add(jta, valuesGrid(1,0,1,1));
        text = new JTextField(10);
        text.addKeyListener(this);
        panel.add(text, valuesGrid(1,1,1,1));
                
        dg = new Dialog("Registrar");
        dg.setcontenido(panel);
        dg.setLocationRelativeTo(this);
        dg.setVisible(true);
    }
    /**
     * 
     * Permite simplificar el uso del gridBagLayout 
     * 
     * @param gridx ubiacion en x en el grid
     * @param gridy ubiacion en y en el grid
     * @param gridWidth cuantas lugares ocupa en x
     * @param gridHeight cuantas lugares ocupa en y
     * 
     * @return GridBagConstraints personalizado
     */
    public GridBagConstraints valuesGrid(int gridx,int gridy, int gridWidth, int gridHeight)
    {
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = gridx;
        gbc.gridy = gridy;
        gbc.gridwidth = gridWidth;
        gbc.gridheight = gridHeight;
        
        return gbc;
    }
    /**
     * Permite simplificar el uso del gridBagLayout
     * 
     * @param gridx ubicacion en x en el grid
     * @param gridy ubicacion en y en el grid
     * 
     * @return GridBagConstraints personalizado 
     */
    public GridBagConstraints valuesGrid(int gridx,int gridy)
    {
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = gridx;
        gbc.gridy = gridy;
        return gbc;
    }
}
